package com.hbpa.pan.core.response;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;

import java.io.Serializable;
import java.util.Objects;

/**
 * @author: BlcakTiger
 * @date: 2023/10/14 14:15
 * @contact: hsf6661@163.com
 * @description: 公共的返回对象
 */
//保证json序列化的时候，如果属性为null，key也就一起消失了
@JsonInclude
@Getter
public class ResponseEntity<T> implements Serializable {

    /**
     * 状态码
     */
    private Integer code;

    /**
     * 状态说明文案
     */
    private String message;

    /**
     * 响应的数据
     * 用于返回承载
     */
    private T data;

    private ResponseEntity(Integer code){
        this.code = code;
    }

    private ResponseEntity(Integer code,String message){
        this.code = code;
        this.message = message;
    }

    private ResponseEntity(Integer code,String message,T data){
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 判断状态码是否为"SUCCESS"
     * @JsonIgnore 序列化时忽略isSuccess属性
     * @return
     */
    @JsonIgnore
    @JSONField(serialize = false)
    public boolean isSuccess(){
        return Objects.equals(this.code,ResponseCode.SUCCESS);
    }

    /**
     * 成功返回响应体对象
     * 仅返回{成功的状态码}
     * @param <T>
     * @return
     */
    public static <T> ResponseEntity<T> success(){
        return new ResponseEntity<T>(ResponseCode.SUCCESS.getCode());
    }

    /**
     * 成功返回响应体对象
     * 仅返回{错误的状态码、状态说明文案}
     * @param message 状态说明文案
     * @param <T>
     * @param code
     * @param data
     * @return
     */
    public static <T> ResponseEntity<T> success(Integer code,String message,T data){
        return new ResponseEntity<T>(ResponseCode.SUCCESS.getCode(),message,data);
    }

    /**
     * 状态说明文案
     * 仅返回{错误的状态码、状态说明文案、响应体数据}
     * @param data 响应体数据
     * @param <T>
     * @return
     */
    public static <T> ResponseEntity<T> success(T data){
        return new ResponseEntity<T>(ResponseCode.SUCCESS.getCode(),ResponseCode.SUCCESS.getDesc(),data);
    }

    public static <T> ResponseEntity<T> data(T data){
        return new ResponseEntity<T>(null,null,data);
    }

    /**
     * 失败返回响应体对象
     * 仅返回{错误的状态码}
     * @param <T>
     * @return
     */
    public static <T> ResponseEntity<T> fail(){
        return new ResponseEntity<T>(ResponseCode.ERROR.getCode());
    }

    /**
     * 失败返回响应体对象
     * 仅返回{错误的状态码}
     * @param code 指定的错误状态码
     * @param message 错误说明
     * @param <T>
     * @return
     */
    public static <T> ResponseEntity<T> fail(Integer code,String message){
        return new ResponseEntity<T>(code,message);
    }

    /**
     * 失败返回响应体对象
     * 仅返回{错误的状态码、状态说明}
     * @param message 状态说明文案
     * @param <T>
     * @return
     */
    public static <T> ResponseEntity<T> fail(String message){
        return new ResponseEntity<T>(ResponseCode.ERROR.getCode(),message);
    }


    /**
     * 失败返回响应体对象
     * 仅返回{错误的状态码、状态说明、响应体数据}
     * @param data 响应体数据
     * @param <T>
     * @return
     */
    public static <T> ResponseEntity<T> fail(T data){
        return new ResponseEntity<T>(ResponseCode.ERROR.getCode(),ResponseCode.ERROR.getDesc(),data);
    }


}
